
assoc = function (file, INDEX) # Cria a fun????o
{

#### INDICES DE ASSOCIACAO OBSERVADOS
file = na.omit(file) #Retira quaisquer NAs dos dados
file2 = file[,1] #Transforma a primeira coluna do dataframe em um objeto separado
file = file[,-1] #Retira a primeira columa do dataframe, deixando apenas as observa??es de presen?a e ausencia dos individuos

indices=matrix(NA, ncol=ncol(file), nrow=ncol(file)) # Criar uma matriz para guardar os indices de associacao observados

for(a in 1:(ncol(file)-1))# Repeticoes para cada par de individuos
{
  for(b in (a+1):ncol(file))#  Repeticoes para cada par de individuos
  {
    x = length(file[,a][file[,a]==1 & file[,b]==1]) #numero de vezes a e b estavam no mesmo grupo
    x
    
    indjuntos = aggregate(file, list(c(file2)), sum) # Juntando as observacoes de cada repeti??o para averiguar depois os indiv?duos observados na mesma repeticao
    
    yab =  (length(indjuntos[,a][indjuntos[,a]>=1 | indjuntos[,b]>=1])) - x #numero de vezes que os dois indiv?duos foram observados, por?m em grupos diferentes
    yab

    ya = length(file[,a][file[,a]==1 & file[,b]==0]) #numero de vezes em que o individuo a foi observado em um grupo, mas nao b
    ya

    yb = length(file[,a][file[,b]==1 & file[,a]==0])#numero de vezes em que o individuo b foi observado em um grupo, mas nao a
  yb


  if (INDEX == "sri") #escolha do usuario
  {
index = x/(x + yab + ya + yb) #simple ratio index
  }
  if (INDEX == "hwi") #escolha do usuario
  {
index = x/(x + yab + 1/2*(ya + yb)) #half weight index
  }
  if (INDEX == "twi") #escolha do usuario
  {
index = x/(x + (2*yab) + ya + yb) #twice weight index
  }
  if(INDEX!="sri"&INDEX!="hwi"& INDEX!="twi") #Parar a funcao se o usuario nao escolheu um indice
  {
    stop("Nenhum indice de associacao escolhido") # Aviso de erro
  }
  
  
indices[a,b] = index #Salvar os resultados em uma matriz
  }
  
}

indices



##### HISTOGRAMA DE FREQUENCIAS OBSERVADAS

hist(indices, main="Histograma dos Indices de Associacao \n Observados", xlab="Valor do Indice de Associacao",ylab="Frequencia", col = "purple") #Cria histograma dos valores do indice de associacao observados




##### TESTE DE SIGNIFIC?NCIA - PERMUTACAO


pmontecarlo=matrix(NA, ncol=ncol(file), nrow=ncol(file)) # Criar uma matriz para guardar os resultados de p depois do teste de significancia

for(i in 1:(ncol(file)-1)) # Repeticoes para cada par de individuos
{
  for(j in (i+1):ncol(file)) # Repeticoes para cada par de individuos
  {

  simulaab = rep(NA, 1000) #Vetor para guardar os valores de cada simula??o.

  simulaab[1] = indices[i,j] #Valor observado na primeira posicao do vetor da simulacao

  for (v in 2:1000) #Ciclo com contador (v) que vai de 2 a 1000 para as simulacoes
  {
    filemc = apply(file, 1, sample) # Aqui os dados sao embaralhados, mantendo o mesmo numero de individuos em cada grupo
    filemc = data.frame(t(filemc)) #Transpor o resultado do apply com o sample que inverte a posicao de linhas e coluna dos dados

    indicesmc=matrix(NA, ncol=ncol(file), nrow=ncol(file)) # Matriz para guardar os indices gerados aleatoriamente
    
    for(c in 1:(ncol(file)-1)) # Repeticoes para cada par de indiv?duos
    {
      for(d in (c+1):ncol(file)) # Repeticoes para cada par de indiv?duos
      {
        
        x = length(filemc[,c][filemc[,c]==1 & filemc[,d]==1]) #numero de vezes a e b estavam no mesmo grupo
        x
        
        indjuntos = aggregate(filemc, list(c(file2)), sum) # Juntando as observacoes de cada repeticao para averiguar depois os individuos observados na mesma repeticao
        
        yab =  (length(indjuntos[,c][indjuntos[,c]>=1 | indjuntos[,d]>=1])) - x #numero de vezes que os dois individuos foram observados, porem em grupos diferentes
        yab
        
        ya = length(filemc[,c][filemc[,c]==1 & filemc[,d]==0]) #numero de vezes em que o individuo a foi observado em um grupo, mas nao b
        ya
        
        yb = length(filemc[,c][filemc[,c]==1 & filemc[,d]==0])#numero de vezes em que o indiv?duo b foi observado em um grupo, mas n?o a
        yb
        
        
        if (INDEX == "sri") #escolha do usuario
        {
          indexmc = x/(x + yab + ya + yb) #simple ratio index
        }
        if (INDEX == "hwi")#escolha do usuario
        {
          indexmc = x/(x + yab + 1/2*(ya + yb)) #half weight index
        }
        if (INDEX == "twi")#escolha do usuario
        {
          indexmc = x/(x + (2*yab) + ya + yb) #twice weight index
        }
        
        
        indicesmc[c,d] = indexmc #Salvar os resultados em uma matriz
        
      }
      
    }
      simulaab[v] = indicesmc[i,j] #Salvar os resultados em um vetor
    }
    
  obsXesp=sum(simulaab>=simulaab[1]) #Separar os indices formados aleatoriamente que est?o acima do valor observado
  p=obsXesp/length(simulaab) #Qual a proporcaoo de valores aleatorios sao maiores do que o valor observado
  pmontecarlo [i,j] = p # Guardar esse valor em uma matriz
  
  }
  
} 

listaassoc = list(c(indices,pmontecarlo)) # Criando lista com o objeto indices e o objeto pmontecarlo

return(listaassoc) # O que a fun????o vai retornar para o usuario

}# Fechar a funcao
